﻿using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region 知识一 什么是序列化和反序列化
        //序列化:把对象转化为可传输的字节序列过程称为序列化
        //反序列化：把字节序列还原为对象的过程称为反序列化

        //说人话：
        //序列化就是把想要存储的内容转换为字节序列用于存储或传递
        //反序列化就是把存储或收到的字节序列信息解析读取出来使用
        #endregion

        #region 知识二 xml序列化
        //1.第一步准备一个数据结构类
        Player player = new Player();

        //2.进行序列化
        //  关键知识点
        //  XmlSerializer用于序列化对象为xm1的关键类
        //  Streamlriter用于存储文件
        //  using用于方便流对象释放和销毁

        //第一步：确定存储路径
        string path = Application.persistentDataPath + "/Player.xml";
        //第二步：结合using知识点 和 SteamWriter这个流对象 来写入文件
        //括号内的代码:写入一个文件流如果有该文件直接打开并修改如果没有该文件直接新建一个文件
        //using 的新用法括号当中包裹的声明的对象会在大括号语句块结束后自动释放掉
        //当语句块结束会自动帮助我们调用对象的Dispose这个方法让其进行销毁
        //using一般都是配合内存占用比较大或者有读写操作时进行使用的
        using (StreamWriter steam = new StreamWriter(path))
        {
            //第三步：进行xml文件序列化
            XmlSerializer s = new XmlSerializer(typeof(Player));
            //这句代码的含义就是通过序列化对象对我们类对象进行翻译将其翻译成我们的xml文件写入到对应的文件中 
            //第一个参数:文件流对象
            //第二个参数:想要备翻译的对象
            //注意:翻译机器的类型一定要和传入的对象是一致的不然会报错
            s.Serialize(steam, player);
            Debug.LogFormat("savePath:{0}", path);
        }
        #endregion

        #region 知识三 自定义节点名 或 设置属性
        //通过特性 设置节点或者设置属性 并且修改名字
        #endregion

        #region 总结
        //序列化流程
        //1.有一个想要保存的类对象
        //2.使用xmlserializer序列化该对象
        //3.通过streamlriter配合using将数据存储写入文件
        //注意:
        //1.只能序列化公共成员
        //2.不支持字典序列化
        //3.可以通过特性修改节点信息或者设置属性信息
        //4.Stream相关要配合using使用 
        #endregion
    }
}
